home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / raytrace / rayshade / graphtal.lzh / Graphtal.Amiga / GeoObject.C < prev    next >
C/C++ Source or Header  |  1992-11-17  |  2KB  |  73 lines

  1. /*
  2.  * GeoObject.C - base class for geometric primitives.
  3.  *
  4.  * Copyright (C) 1992, Christoph Streit (streit@iam.unibe.ch)
  5.  *                     University of Berne, Switzerland
  6.  * All rights reserved.
  7.  *
  8.  * This software may be freely copied, modified, and redistributed
  9.  * provided that this copyright notice is preserved on all copies.
  10.  *
  11.  * You may not distribute this software, in whole or in part, as part of
  12.  * any commercial product without the express consent of the authors.
  13.  *
  14.  * There is no warranty or other guarantee of fitness of this software
  15.  * for any purpose.  It is provided solely "as is".
  16.  *
  17.  */
  18.  
  19. #include "GeoObject.h"
  20. #include "transform.h"
  21.  
  22. //___________________________________________________________ GeoObject
  23.  
  24. long GeoObject::intersectionTests = 0;
  25. long GeoObject::intersections = 0;
  26.  
  27. implementList(GeoObjectList, GeoObjectPtr);
  28.  
  29. GeoObject::GeoObject()
  30. : trans(NULL), itrans(NULL)
  31. {}
  32.  
  33. GeoObject::~GeoObject()
  34. {
  35.   if (trans != NULL)  delete trans;
  36.   if (itrans != NULL) delete itrans;
  37. }
  38.  
  39. /*
  40.  *
  41.  */
  42. Vector GeoObject::getNormal(const Vector& p) const
  43. {
  44.   if (itrans != NULL) {
  45.  
  46.     /*
  47.      * Transform intersection point to object space and compute normal.
  48.      */
  49.     Vector n = normal(p*(*itrans));
  50.  
  51.     /*
  52.      * Transform normal back to world space (multiply by the transpose of
  53.      * the inverse transformation matrix, not regarding the translations).
  54.      */
  55.     return normalTransform(n, *itrans);
  56.   }
  57.   else
  58.     return normal(p);
  59. }
  60.  
  61. /*
  62.  * Set the transformation matrix and compute the inverse of it.
  63.  * SetTransform returns FALSE if the matrix is singular, TRUE
  64.  * otherwise.
  65.  */
  66. int GeoObject::setTransform(TransMatrix* tmat)
  67. {
  68.   trans = tmat;
  69.   itrans = new TransMatrix(*trans);
  70.   return itrans->invert();
  71. }
  72.  
  73.